package com.zx._01_基础._010_util;

import org.junit.Test;
import org.springframework.util.StopWatch;

/**
 * @version v1.0
 * @Project: knowledge
 * @Title: StringBuilderTest
 * @Description: StringBuilder 内部使用的是char[]保存数据，涉及到数组的扩容
 *         性能的瓶颈其实和很多数组实现的集合一样就是扩容。
 *         所以合理的设置初始化容量，能提高不少性能
 * @author: zhangxue
 * @date: 2020-8-1621:05:51
 * @company: zhangxue
 * @Copyright: Copyright (c) 2015
 */
public class StringBuilderTest {

    private static final int LEN = 1000 * 1000;

    // 简单使用
    @Test
    public void test01() {
        StringBuilder sb = new StringBuilder();

        // 最后追加字符串
        sb.append("java");

        // 指定位置插入
        sb.insert(0, "hello ");

        // 指定范围替换
        sb.replace(5, 6, ",");

        // 指定范围删除
        sb.delete(5, 6);

        // 反转
        sb.reverse();
        //返回当前的容量。可用的容量是新插入的字符,除了分配将发生。
        sb.capacity(); //sb.capacity()-sb.length()为定值16

        // 改变StringBuilder的长度，将只保留前面部分
        sb.setLength(5);
    }


    @Test
    public void test02() {
        StopWatch sw = new StopWatch();

        sw.start("一般使用");
        test1();
        sw.stop();

        sw.start("设置容量");
        test2();
        sw.stop();

        System.out.println(sw.prettyPrint());
    }

    public void test1() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < LEN; i++) {
            sb.append(i);
        }
    }

    public void test2() {
        StringBuilder sb = new StringBuilder(LEN * 5);
        for (int i = 0; i < LEN; i++) {
            sb.append(i);
        }
    }


}
